package calculadoraCORBA;

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;

class CalculadoraImp extends calculadoraPOA{
	private ORB orb;
	
	public void setORB(ORB orb_val) {
		orb = orb_val;
	}
	
	public double sumar (double p1, double p2){
		return p1 + p2;
	}
	
	public double restar (double p1, double p2){
		return p1 - p2;
	}
	
	public double multiplicar (double p1, double p2){
		return p1 * p2;
	}
	
	public double dividir (double p1, double p2){
		return p1 / p2;
	}

	public void shutdown() {
		orb.shutdown(false);
	}
}

public class Servidor {
	public static void main(String args[]) {
		try {
			// create and initialize the ORB
			ORB orb = ORB.init(args, null);
			
			// get reference to rootpoa & activate the POAManager
			POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
			rootpoa.the_POAManager().activate();
			
			// create servant and register it with the ORB
			CalculadoraImp calculadoraImpl = new CalculadoraImp();
			calculadoraImpl.setORB(orb);
			
			// get object reference from the servant
			org.omg.CORBA.Object ref = rootpoa.servant_to_reference(calculadoraImpl);
			calculadora href = calculadoraHelper.narrow(ref);
			
			// get the root naming context
			org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
			// Use NamingContextExt which is part of the Interoperable
			// Naming Service (INS) specification.
			NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
			
			// bind the Object Reference in Naming
			String name = "Calculadora";
			NameComponent path[] = ncRef.to_name(name);
			ncRef.rebind(path, href);
			
			System.out.println("El servidro de la calculadora ha arrancado...");
			
			// wait for invocations from clients
			orb.run();
		} catch (Exception e) {
			System.err.println("ERROR: " + e);
			e.printStackTrace(System.out);
		}
		
		System.out.println("Se ha cerrado el servidor ...");
	
	}
}
